package controlador;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import modelo.servicios.InformacionBasica;
import org.apache.log4j.Logger;

/**
 * Clase que recibe la orden de impresión de mensaje de colapso del sistema por parte del nodo
 * coordinador
 * @author Eduardo
 */
public class ServidorColapso extends Thread {

    private static ServerSocket servidor = null;
    private static boolean kill = false;

    private static Logger logger = Logger.getLogger(ServidorColapso.class);

    /**
     * Constructor de la clase. Inicia la ejecución del hilo
     */
    public ServidorColapso() {
        start();
    }

    @Override
    public void run() {
        InformacionBasica ib = (new Informacion()).obtenerInformacionBasica();

        try {
            servidor = new ServerSocket(ib.getPuertoRSD());
        } catch (IOException ex) {
            System.err.println(ex);
        }

        if (ib.getPuertoRSD() > 1024) {
            while(!kill) {
                try {
                    System.out.println("Esperando orden del coordinador para imprimir mensaje de " +
                            "colapso en el tanque " + ib.getIdTanque() + " por el puerto " +
                            ib.getPuertoRSD());

                    /**
                     * Recibiendo entradas de petróleo
                     */
                    Socket sock = servidor.accept();

                    /**
                     * Abriendo flujo de entrada de datos
                     */
                    ObjectInputStream input = new ObjectInputStream(sock.getInputStream());
                    String estadoRecibido = (String)input.readObject();

                    System.out.println(estadoRecibido);
                    logger.info(estadoRecibido);

                    if (!estadoRecibido.equals("false")) {
                        String[] mensajeColapso = estadoRecibido.split(".");

                        logger.error("Colapso del sistema");
                        logger.error(mensajeColapso[1]);
                        logger.error(mensajeColapso[2]);
                        logger.error(mensajeColapso[3]);

                        System.out.println(mensajeColapso);

                        System.exit(0); //Preguntar al profesor
//                        terminarEjecucion(true);
                    }

                    /**
                     * Cerrando el flujo de entrada de datos
                     */
                    input.close();

                    /**
                     * Cerrando el socket
                     */
                    System.out.println("Cerrando el socket");
                    sock.close();
                } catch (IOException ex) {
                    logger.error("Ocurrio un error de entrada/salida de datos");
                    System.out.println("Ocurrió un error de entrada/salida de datos");
                } catch (ClassNotFoundException ex) {
                    logger.error("Ocurrio un error de Clase No Encontrada");
                    System.out.println("Ocurrió un error de Clase No Encontrada");
                }
            }
        }
    }

    /**
     * Termina la ejecución del hilo
     * @param kill Valor lógico que permite determinar cuándo un hilo será detenido
     */
    public void terminarEjecucion(boolean kill) {
        ServidorColapso.kill = kill;
    }
}